import java.util.*;

public class mst_01_08 {
    //面试题 01.08. 零矩阵 中等
    public static void main(String[] args) {
        int arr[][] = {{0, 1, 2, 0}, {3, 4, 5, 2}, {1, 3, 1, 5}};
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + ",");
            }
            System.out.println();
        }
        System.out.println("**********************");
        setZeroes(arr);
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + ",");
            }
            System.out.println();
        }
    }
    //定义一个变量标记
    public static void setZeroes(int[][] matrix){
        int a = matrix.length;
        int b = matrix[0].length;
        boolean falg = false;
        for(int i = 0;i<a;i++){
            if(matrix[i][0]==0){
                falg = true;
            }
            for(int j =1;j<b;j++){
                if(matrix[i][j] ==0){
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        //如果标记列 则行从最后一行开始
        //如果标记行 则列从最后一行开始
        for(int i = a-1;i>=0;i--){
            for(int j = 1;j<b;j++){
                if(matrix[i][0] ==0 || matrix[0][j] ==0){
                    matrix[i][j] = 0;
                }
            }
        }
        if(falg){
            for(int i= 0;i<a;i++){
                matrix[i][0] = 0;
            }
        }
    }
//定义两个变量记录第0列和第0行的值
//    public static void setZeroes(int[][] matrix) {
//        boolean a = false;
//        boolean b = false;
//        int len1 = matrix.length;
//        int len2 = matrix[0].length;
//        for (int i = 0; i < len1; i++) {
//            if (matrix[i][0] == 0) {
//                a = true;
//                break;
//            }
//        }
//        for (int i = 0; i < len2; i++) {
//            if (matrix[0][i] == 0) {
//                b = true;
//                break;
//            }
//        }
//        for (int i = 1; i < len1; i++) {
//            for (int j = 1; j < len2; j++) {
//                if (matrix[i][j] == 0) {
//                    matrix[0][i] = 0;
//                    matrix[j][0] = 0;
//                }
//            }
//        }
//
//        for (int i = 1; i < len1; i++) {
//            for (int j = 1; j < len2; j++) {
//                if(matrix[i][0] ==0 || matrix[0][j]==0){
//                    matrix[i][j] = 0;
//                }
//            }
//        }
//
//        if(a){
//            for(int i =0;i<len1;i++){
//                matrix[i][0] = 0;
//            }
//        }
//        if(b){
//            for(int i =0;i<len2;i++){
//                matrix[0][i] = 0;
//            }
//        }
//
//
//    }


//复制同矩阵记录0位置
//    public static void setZeroes(int[][] matrix) {
//        boolean arr[] = new boolean[matrix.length];
//        boolean brr[] = new boolean[matrix[0].length];
//        for (int i = 0; i < matrix.length; i++) {
//            for (int j = 0; j < matrix[0].length; j++) {
//                if (matrix[i][j] == 0) {
//                    arr[i] = true;
//                    brr[j] = true;
//                }
//            }
//        }
//        for (int i = 0; i < matrix.length; i++) {
//            for (int j = 0; j < matrix[0].length; j++) {
//                if(arr[i] || brr[j]){
//                    matrix[i][j] = 0;
//                }
//            }
//        }
//
//    }
    //利用map将每个0坐标记录
//    public static void setZeroes(int[][] matrix) {
//        List<Map<Integer,Integer>> list = new ArrayList<>();
//        int y = matrix.length;
//        int x = matrix[0].length;
//        for(int i =0;i<y;i++){
//            for(int j =0;j<x;j++){
//                if(matrix[i][j] == 0){
//                    Map<Integer,Integer> map = new HashMap<>();
//                    map.put(i,j);
//                   list.add(map);
//                }
//            }
//        }
//        for (Map<Integer, Integer> map : list) {
//            for (Map.Entry<Integer, Integer> integerIntegerEntry : map.entrySet()) {
//                Integer a = integerIntegerEntry.getKey();
//                Integer b = integerIntegerEntry.getValue();
//                System.out.println(a+","+b);
//                setArr(a,b,matrix);
//            }
//        }
//    }
//    public static void setArr(int x,int y ,int arr[][]){
//        int len1 = arr.length;
//        int len2 = arr[0].length;
//        for(int i = 0; i<len1;i++){
//            for(int j = 0;j<len2;j++){
//                if(i == x || j == y){
//                    arr[i][j]=0;
//                    //map.remove(x);
//                   // list.remove()
//                }
//            }
//        }
//    }
}
